package catalogo;

import java.io.*;
import java.util.*;

public class Main
{
    Vector archivos;
    Map padres;
    int depth;
    int id;
    String dirs_path = "/home/lucas/NetBeansProjects/catalogo/src/catalogo/d";
    String files_path = "/home/lucas/NetBeansProjects/catalogo/src/catalogo/a";

    public void recorrer(String folder_name, boolean showFiles)
    {
        File folder = new File(folder_name);
        id = 0;
        depth = 0;
        if(folder == null)
        {      
            System.out.println("The initial folder '" + folder_name + "' does not exists.");
            return;
        }
        if(!folder.isDirectory())
        {
            System.out.println("The initial folder '"+ folder.getAbsolutePath()+ "' is not a directory.");
            return;
        }
        archivos = new Vector();
        padres = new HashMap();
        padres.put(folder_name, id);
        addFiles(folder, archivos, showFiles);
        
        escribirArchivo(showFiles);
        /*leerArchivo(dirs_path);
        leerArchivo(files_path);*/
    }

    private void escribirArchivo(boolean showFiles)
    {
        try
        {
            RandomAccessFile directorio = new RandomAccessFile(dirs_path, "rw");
            RandomAccessFile archivo = new RandomAccessFile(files_path, "rw");
            for(int i = 0; i < archivos.size(); i++)
            {
                boolean isFile =! ((Jerarquia)archivos.elementAt(i)).file.isDirectory();
                if((isFile && showFiles) || !isFile)
                {
                    int padre = ((Jerarquia)archivos.elementAt(i)).padre;
                    String file = ((Jerarquia)archivos.elementAt(i)).file.getName();
                    int tamaño = ((Jerarquia)archivos.elementAt(i)).file.getName().length();
                    int profundidad = ((Jerarquia)archivos.elementAt(i)).depth;
                    int id = ((Jerarquia)archivos.elementAt(i)).id;
                    if(isFile)
                    {
                        archivo.writeInt(id);
                        archivo.writeInt(padre);
                        archivo.writeInt(tamaño);
                        archivo.writeChars(file);
                    }
                    else
                    {
                        directorio.writeInt(id);
                        directorio.writeInt(padre);
                        directorio.writeInt(tamaño);
                        directorio.writeChars(file);
                    }
                }
            }
            directorio.close();
            archivo.close();            
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }
    private void leerArchivo(String name)
    {
         try
        {
            RandomAccessFile directorios = new RandomAccessFile(name, "r");
            while(directorios.getFilePointer() < directorios.length())
            {
                int id = directorios.readInt();
                int padre = directorios.readInt();
                int cantidad = directorios.readInt();
                char[] nombre = new char[cantidad];
                for(int i = 0; i < cantidad; i++)
                {
                    nombre[i] = (directorios.readChar());
                }
            }
            directorios.close();
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }
    
    private void addFiles(File folder, Vector vfiles, boolean showFiles)
    {
        File[] files=folder.listFiles();
        files = ordenar_vector(files, 0, files.length - 1);
        files = ordenar_vector(files, 0, 0, files.length - 1);
        for(int i=0; i < files.length; i++)
        {
            File file=files[i];
            String padre = (padres.get(file.getParent())).toString();
            boolean isFile =!file.isDirectory();
            id++;
            if((isFile && showFiles) || !isFile)
            {
                Jerarquia j = new Jerarquia(file, Integer.parseInt(padre), depth, id);
                vfiles.add(j);
            }
            if(file.isDirectory())
            {
                depth++;
                padres.put(file.getAbsolutePath(), id);
                addFiles(file, vfiles, showFiles);
            }
        }
        depth--;
    }

    public static File[] ordenar_vector(File[] array, int izq, int der)
    {
        File temp;
        for(int i=0; i<array.length-1; i++)
        {
            for(int j=i+1; j< array.length; j++)
            {
                if(!array[i].isDirectory())
                {
                    temp = array[i];
                    array[i] = array[j];
                    array[j] = temp;
                }
            }
        }
        return array;
    }

    public static File[] ordenar_vector(File[] array, int param, int izq, int der)
    {
        File temp;
        for(int i=0; i<array.length-1; i++)
        {
            for(int j=i+1; j< array.length; j++)
            {
                if(array[i].isDirectory() != array[j].isDirectory())
                {
                    j = array.length;
                    continue;
                }
                if((array[i].getName()).compareToIgnoreCase(array[j].getName()) > 0)
                {
                    temp = array[i];
                    array[i] = array[j];
                    array[j] = temp;
                }
            }
        }
        return array;
    }
}
